#include <string>

#include "GL/glew.h"
#include "GL/glut.h"

#include "vector_util.h"

using namespace std;

static const string faceNames[6] = {
    "left",
    "right",
    "top",
    "bottom",
    "back",
    "front"
};

static const GLenum faceTargets[6] = {
  GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,
  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,
  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
};

typedef GLfloat cubemapBRDF(GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);

typedef GLfloat cubemapWeight(GLfloat, GLfloat, GLfloat);

void cubemapXYZFromST(GLfloat& x, GLfloat& y, GLfloat& z, GLenum face, GLfloat s, GLfloat t);

GLfloat lambertian(GLfloat ix, GLfloat iy, GLfloat iz, GLfloat vx, GLfloat vy, GLfloat vz);

GLfloat y00(GLfloat x, GLfloat y, GLfloat z);
GLfloat y11(GLfloat x, GLfloat y, GLfloat z);
GLfloat y10(GLfloat x, GLfloat y, GLfloat z);
GLfloat y1n1(GLfloat x, GLfloat y, GLfloat z);
GLfloat y22(GLfloat x, GLfloat y, GLfloat z);
GLfloat y21(GLfloat x, GLfloat y, GLfloat z);
GLfloat y20(GLfloat x, GLfloat y, GLfloat z);
GLfloat y2n1(GLfloat x, GLfloat y, GLfloat z);
GLfloat y2n2(GLfloat x, GLfloat y, GLfloat z);

GLfloat y00e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y11e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y10e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y1n1e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y22e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y21e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y20e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y2n1e(GLfloat x, GLfloat y, GLfloat z);
GLfloat y2n2e(GLfloat x, GLfloat y, GLfloat z);
